const puppeteer = require('puppeteer')
const { jsonToQueryString, checkQueryStringLength } = require('../utils')

// 无头浏览器，只需要启动一次
let browser = null
let page = null

;(async () => {
  browser = await puppeteer.launch({
    // 如果需要在无头浏览器中使用Chrome扩展，可以在这里添加参数
    // --no-sandbox: 以root权限启动Chrome ubuntu下需要
    // --disable-setuid-sandbox: 禁用沙盒 ubuntu下需要
    // --disable-extensions: 禁用扩展] 优化启动速度
    args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-extensions'],
    headless: true
  })
  page = await browser.newPage()
})()

async function renderToImage(req, res) {
  const poster = req.poster

  await page.setViewport({
    width: poster.width || 600,
    height: poster.height || 400,
    deviceScaleFactor: poster.deviceScaleFactor || 1
  })

  // 处理参数
  const queryString = jsonToQueryString(req.query)
  if (!checkQueryStringLength(queryString)) {
    return res.status(400).send({ err: 'Query string too long' })
  }

  // 可以载入路径 也可以直接使用HTML
  const url = `http://127.0.0.1:${poster.port}${poster.page}?${queryString}`

  await page.goto(url)
  await page.waitForSelector('#target');

  // // 渲染Pug模板为HTML字符串 也可以直接使用HTML
  // // 使用Pug模板，页面的所有路径需要填写完整的URL，因为在无头浏览器中渲染时，是没有服务器环境的
  // res.render("page", arg, async (err, html) => {
  //   if (err) {
  //     console.error("Error rendering Pug template:", err);
  //     res.status(500).send("Internal server error");
  //     return;
  //   }

  //   // 载入HTML内容
  //   await page.setContent(html);
  // });

  // 将页面渲染为PNG图片并发送给客户端
  // 如果需要将图片转换为Base64编码，可以使用以下代码
  const imageBuffer = await page.screenshot({ type: 'png' })
  res.set('Content-Type', 'image/png')
  res.send(imageBuffer)

  // // 将Buffer对象转换为Base64字符串
  // const base64Image = imageBuffer.toString("base64");

  // // 将Base64编码的PNG图片发送给客户端
  // res.set("Content-Type", "text/plain");
  // res.send(base64Image);

}

module.exports = { renderToImage }
